/**
   Version 1.0
   @file Scenario.c
   @fn void DeroulerScenario(GtkWidget *pButton,gpointer user_data)
   Tout d'abord pour chaque iteration de la boucle for la fonction recupere le nom des marqueur dans le tableau dynamique
   et les rajoute au scenario avec la fonction <b>clutter_timeline_add_marker_at_time</b>.<br>
   Ensuite en fonction de la valeur du parametre index_fonction du marqueur, le switch lance
   la fonction animation correspondante :<br>
   - index_fonction = 1 -> Deplacement Gauche Droite
   - index_fonction = 2 -> Deplacement Haut Bas 
   - index_fonction = 3 -> Deplacement ScaleX (ne fonctionne pas tres bien)
   - index_fonction = 4 -> Deplacement Rotation (ne fonctionne pas tres bien)
   
*/
#include "Scenario.h"
#include "Animation.h"
#include <string.h>

/*Precondition : Scenario non initialise*/
void InitScenario(Scenario * sc)
{
  sc->tab_mq=g_array_new(FALSE,FALSE,sizeof(Marqueur));
}

/*Precondition : Scenario initialise*/                                                                                   
/*Postcondition : Rajoute un marqueur au scenario*/
void RajouterMarqueur(GtkWidget *pButton,gpointer data)
{
  Sc * S = (Sc*)data;
  g_array_append_val(S->s->tab_mq,*(S->m));
}

/*Precondition : Scenario initialise, i position du marqueur dans le scenario*/
void ModifMarqueur(Scenario * sc,Marqueur mq,unsigned int i)
{
  g_array_remove_index(sc->tab_mq,i);
  g_array_insert_val(sc->tab_mq,i,mq);
}

/*Precondition : Scenario initialise*/
void SuppMarqueur(Scenario * sc,unsigned int i)
{
  g_array_remove_index(sc->tab_mq,i);
}

/*Precondition : Scenario initialisee*/
/*Postcondition : Le Scenario ne peut plus etre utilisee*/                                                                           /*la memoire alloue pour le tableau est supprimee*/
void SuppScenario(Scenario * sc)
{
  g_array_free(sc->tab_mq,FALSE);
}

/*Fonction qui deroule le scenario*/
void DeroulerScenario(GtkWidget *pButton,gpointer user_data)
{
  int i;
  gchar * dest;
  gchar tmp[250]="marker-reached::";
  
  Sc * S=(Sc*)user_data;

  Marqueur * m;
  
  /*On declare la longueur de l'animation*/
  ClutterTimeline *timeline = clutter_timeline_new(10000);
  clutter_timeline_start(timeline);
      
  for(i=0;i<S->s->tab_mq->len;i++)
  {
    m = &g_array_index(S->s->tab_mq,Marqueur,i);
    /*On met en place le marqueur*/
    clutter_timeline_add_marker_at_time(timeline,m->nom_marqueur,m->position_scenario);
    dest = m->nom_marqueur;
    strcat(tmp,dest);
      
    switch(m->index_fonction){
    
    case 1 :
      
      /*On appele la fonction correspondante a l'index 1*/
      g_signal_connect(timeline,tmp,G_CALLBACK(DeplacementGD),(Marqueur*)m);
      break;
      
    case 2 :
            
      /*On appele la fonction correspondante a l'index 1*/
      g_signal_connect(timeline,tmp,G_CALLBACK(DeplacementHB),(Marqueur*)m);
      break;

    case 3 :
     
      /*On appele la fonction correspondante a l'index 1*/
      g_signal_connect(timeline,tmp,G_CALLBACK(ChangementDechelleX),(Marqueur*)m);
      break;

    case 4 :
      
      /*On appele la fonction correspondante a l'index 1*/
      g_signal_connect(timeline,tmp,G_CALLBACK(RotationZ),(Marqueur*)m);
      break;

    default : printf("ERREUR FATALE\n");
      
      clutter_timeline_remove_marker(timeline,m->nom_marqueur);

    }

  }

}
